package com.atguigu.bigdata.scala.chapter06

object Scala11_Object_Abstract_2 {
    def main(args: Array[String]): Unit = {

        // TODO 面向对象编程 - 抽象

        // 如果一个类是抽象类，不一定有抽象方法和抽象属性
        // 抽象方法意义？归纳，总结
        // 抽象属性意义？所谓的抽象属性底层还是抽象方法
        // String.intern : 获取字符串常量池的引用

        // 子类想要改变父类中方法的逻辑，重写
        // scala中子类想要重写父类的完整方法，那么需要使用override关键字声明，否则会出现错误
        // scala中子类也可以重写父类的属性,如果这个属性是完整属性，那么必须增加override关键字
        // scala中可变完整属性不能被重写,因为如果重写会导致歧义
        new SubUser().test()

    }

    abstract class User {
        // 抽象属性
        val name : String = "zhangsan"
        def test(): Unit = {
            // scala中，给属性赋值，等同于调用属性的set方法
            // 访问这个属性，等同于调用属性的get方法
            // 而set，get方法都是成员方法，都要遵循动态绑定机制
            //name = "wangwu" // 给子类赋值：setName(wangwu)
            println(name) // wangwu
        }
    }

    class SubUser extends User {
        // TODO variable name cannot override a mutable variable
        override val name : String = "lisi"
        // setName(name)
//        override def test(): Unit = {
//            println("subuser test...")
//        }
    }
}